# -*- coding: utf8 -*-
dbc = {
        "digit": [
            u"０", u"１", u"２", u"３", u"４", u"５", u"６", u"７", u"８", u"９",
            u"〇", u"一", u"二", u"三", u"四", u"五", u"六", u"七", u"八", u"九",
            u"零", u"壹", u"贰", u"叁", u"肆", u"伍", u"陆", u"柒", u"捌", u"玖"],

        "uppercase": [
            u"Ａ", u"Ｂ", u"Ｃ", u"Ｄ", u"Ｅ", u"Ｆ", u"Ｇ", u"Ｈ", u"Ｉ", u"Ｊ",
            u"Ｋ", u"Ｌ", u"Ｍ", u"Ｎ", u"Ｏ", u"Ｐ", u"Ｑ", u"Ｒ", u"Ｓ", u"Ｔ",
            u"Ｕ", u"Ｖ", u"Ｗ", u"Ｘ", u"Ｙ", u"Ｚ"],

        "lowercase": [
            u"ａ", u"ｂ", u"ｃ", u"ｄ", u"ｅ", u"ｆ", u"ｇ", u"ｈ", u"ｉ", u"ｊ",
            u"ｋ", u"ｌ", u"ｍ", u"ｎ", u"ｏ", u"ｐ", u"ｑ", u"ｒ", u"ｓ", u"ｔ",
            u"ｕ", u"ｖ", u"ｗ", u"ｘ", u"ｙ", u"ｚ"],

        "punc" : [
            u"　", u"！", u"＂", u"＃", u"＄", u"％", u"＆", u"＇", u"（", u"）",
            u"＊", u"＋", u"，", u"－", u"．", u"／", u"：", u"；", u"＜", u"＝",
            u"＞", u"？", u"＠", u"［", u"＼", u"］", u"＾", u"＿", u"｀", u"｛",
            u"｜", u"｝", u"～"],

        "chinese-punc": [
            u"。", u"、", u"“",  u"”",  u"﹃", u"﹄", u"‘",  u"’",  u"﹁", u"﹂",
            u"…", u"【", u"】", u"《", u"》", u"〈", u"〉", u"·"],

        "punc-ext": [
            u"Ⅺ", u"è", u"é", u"ì", u"í", u"à", u"ǔ", u"ú", u"ù",
            u"ü", u"ò", u"ó", u"м", u"÷", u"⒘", u"⒙", u"⒚", u"⒛", u"⒐",
            u"⒑", u"⒒", u"⒓", u"⒔", u"⒕", u"⒖", u"Å", u"⒈", u"⒉", u"⒊",
            u"⒋", u"⒌", u"⒍", u"⒎", u"⒏", u"⒀", u"⒁", u"⒂", u"⒃", u"⒄",
            u"⒅", u"⒆", u"Õ", u"ペ", u"ホ", u"", u"ベ", u"マ", u"ミ", u"ボ",
            u"ポ", u"ヒ", u"ビ", u"バ", u"パ", u"ブ", u"/", u"ピ", u"フ", u"ナ",
            u"ニ", u"ト", u"ド", u"ハ", u"ヌ", u"ネ", u"ヂ", u"ッ", u"ダ", u"チ",
            u"テ", u"デ", u"ツ", u"ヅ", u"Ш", u"ヲ", u"ン", u"リ", u"ル", u"ヨ",
            u"ラ", u"ヮ", u"ワ", u"レ", u"ロ", u"モ", u"ャ", u"ム", u"メ", u"ユ",
            u"ョ", u"ヤ", u"ュ", u"℃", u"к", u"℉", u"ℓ", u"ㄚ", u"№", u"™",
            u"↓", u"℡", u"ν", u"ё", u"μ", u"©", u"╰", u"р", u"с", u"т",
            u"у", u"ф", u"«", u"ц", u"ч", u"ш", u"щ", u"ъ", u"ы", u"ь",
            u"э", u"ю", u"я", u"ω", u"╯", u"﹉", u"﹊", u"﹌", u"﹍", u"﹎",
            u"﹏", u"﹀", u"﹁", u"﹂", u"﹃", u"﹄", u"Ｗ", u"Ｖ", u"Ｕ", u"Ｔ",
            u"Ｓ", u"Ｒ", u"Ｑ", u"Ｐ", u"＿", u"］", u"＼", u"［", u"Ｚ", u"Ｙ",
            u"Ｘ", u"Ｇ", u"Θ", u"Ｅ", u"Ｄ", u"Ｃ", u"Ｂ", u"Ａ", u"＠", u"Ｏ",
            u"♀", u"Ｍ", u"⒗", u"Ｋ", u"Ｊ", u"Ｉ", u"Ｈ", u"７", u"６", u"５",
            u"４", u"３", u"２", u"１", u"０", u"？", u"＞", u"＝", u"＜", u"；",
            u"：", u"９", u"８", u"＇", u"＆", u"％", u"＄", u"＃", u"＂", u"！",
            u"ξ", u"／", u"．", u"－", u"，", u"＋", u"＊", u"）", u"（", u"×",
            u"◇", u"◆", u"ǘ", u"囍", u"●", u"◎", u"⒇", u"○", u"‖", u"—",
            u"―", u"“", u"”", u"ヘ", u"‘", u"’", u"′", u"″", u"‰", u"※",
            u"㊣", u"…", u"‥", u"†", u"‡", u"╈", u"ê", u"╊", u"卍", u"卐",
            u"╀", u"Ц", u"︻", u"︺", u"︹", u"︸", u"︿", u"︾", u"︽", u"︼",
            u"︷", u"︶", u"︵", u"︴", u"ㄥ", u"ㄤ", u"ī", u"ˇ", u"ˉ", u"ā",
            u"ě", u"ē", u"⌒", u"㎝", u"㎜", u"㎞", u"㎏", u"㎎", u"㎡", u"⅝",
            u"⅜", u"⅞", u"⅛", u"ㄇ", u"ㄆ", u"Ⅹ", u"Ⅸ", u"Ⅻ", u"Ⅵ", u"Ⅴ",
            u"Ⅷ", u"Ⅶ", u"Ⅱ", u"Ⅰ", u"Ⅳ", u"Ⅲ", u"ㄋ", u"ⅹ", u"ⅸ", u"ㄊ",
            u"ⅵ", u"ⅴ", u"ⅷ", u"ⅶ", u"ⅱ", u"ⅰ", u"ⅳ", u"┲", u"ㄎ", u"↖",
            u"↗", u"←", u"↑", u"→", u"↘", u"↙", u"ㄐ", u"ㄗ", u"ㄖ", u"Χ",
            u"ㄕ", u"ψ", u"φ", u"χ", u"τ", u"υ", u"σ", u"π", u"ρ", u"￣",
            u"￠", u"￡", u"￥", u"ㄙ", u"ㄘ", u"θ", u"ㄟ", u"┠", u"ㄞ", u"ㄔ",
            u"ㄝ", u"ㄜ", u"∮", u"イ", u"ェ", u"ウ", u"∪", u"∫", u"∨", u"∩",
            u"キ", u"∧", u"ク", u"∥", u"ォ", u"エ", u"∠", u"オ", u"サ", u"ゴ",
            u"シ", u"∽", u"ケ", u"グ", u"コ", u"ゲ", u"∶", u"∷", u"∴", u"∵",
            u"ス", u"ジ", u"セ", u"ズ", u"ゅ", u"∏", u"ょ", u"ゆ", u"め", u"む",
            u"ゃ", u"も", u"ろ", u"れ", u"わ", u"ゎ", u"ら", u"よ", u"る", u"り",
            u"∞", u"∝", u"√", u"ん", u"を", u"∑", u"や", u"┕", u"ǜ", u"㈧",
            u"㈦", u"㈥", u"㈤", u"㈣", u"㈢", u"㈡", u"㈠", u"㈩", u"㈨", u"㈱",
            u"プ", u"ǎ", u"っ", u"ほ", u"┳", u"┰", u"┱", u"┶", u"┷", u"┴",
            u"┵", u"┺", u"┻", u"┸", u"┹", u"┾", u"┿", u"┼", u"┽", u"┢",
            u"┣", u"ō", u"┡", u"┦", u"┧", u"┤", u"┥", u"┪", u"┫", u"┨",
            u"┩", u"┮", u"┯", u"┬", u"┭", u"┒", u"┓", u"┐", u"┑", u"┖",
            u"┗", u"└", u"┚", u"┛", u"┘", u"┙", u"┞", u"┟", u"├", u"┝",
            u"│", u"─", u"━", u"┆", u"┄", u"┅", u"┊", u"┈", u"┉", u"┎",
            u"┏", u"┌", u"┍", u"ぜ", u"そ", u"ぞ", u"た", u"じ", u"す", u"ず",
            u"せ", u"ご", u"さ", u"ざ", u"し", u"ぐ", u"け", u"げ", u"こ", u"が",
            u"き", u"ぎ", u"く", u"え", u"ぉ", u"お", u"か", u"い", u"ぅ", u"う",
            u"ぇ", u"ぁ", u"あ", u"ぃ", u"ぼ", u"ぽ", u"ま", u"み", u"へ", u"べ",
            u"ぺ", u"ぴ", u"ふ", u"ぶ", u"ぷ", u"ば", u"ぱ", u"ひ", u"び", u"ぬ",
            u"ね", u"の", u"は", u"と", u"ど", u"な", u"に", u"Ｌ", u"づ", u"て",
            u"で", u"だ", u"ち", u"ぢ", u"х", u"ゥ", u"ァ", u"ǒ", u"ィ", u"ア",
            u"ガ", u"ギ", u"ǚ", u"カ", u"ザ", u"ι", u"ｓ", u"ū", u"｛", u"Š",
            u"ソ", u"ゼ", u"タ", u"ゾ", u"ㄛ", u"Β", u"≯", u"≮", u"≡", u"≠",
            u"≥", u"≤", u"≧", u"≦", u"つ", u"ㄅ", u"≈", u"≌", u"≒", u"⊥",
            u"∈", u"〗", u"〖", u"〕", u"〔", u"】", u"【", u"』", u"『", u"」",
            u"「", u"》", u"《", u"〉", u"〈", u"々", u"〃", u"。", u"、", u"⊕",
            u"⊙", u"Ω", u"Ι", u"Ｆ", u"Λ", u"Κ", u"Ν", u"Μ", u"Г", u"В",
            u"Б", u"А", u"З", u"Ο", u"Е", u"Д", u"Л", u"К", u"Й", u"Ξ",
            u"П", u"О", u"Н", u"М", u"Α", u"Ё", u"Ｎ", u"Γ", u"г", u"в",
            u"б", u"♂", u"з", u"ж", u"е", u"д", u"л", u"Ε", u"й", u"и",
            u"п", u"о", u"н", u"Δ", u"У", u"Т", u"С", u"Р", u"Ч", u"Η",
            u"Х", u"Ф", u"Ы", u"Ъ", u"Щ", u"Ζ", u"Я", u"Ю", u"Э", u"Ь",
            u"¤", u"§", u"Ψ", u"®", u"╱", u"¨", u"╳", u"╲", u"╭", u"·",
            u"╮", u"±", u"°", u"½", u"¼", u"¾", u"»", u"º", u"ǐ", u"〓",
            u"Ρ", u"╉", u"ノ", u"╋", u"Π", u"╅", u"╄", u"╇", u"╆", u"╁",
            u"Σ", u"╂", u"ㄣ", u"ㄢ", u"ㄡ", u"ㄠ", u"ㄧ", u"ㄦ", u"▲", u"△",
            u"▼", u"▽", u"ㄩ", u"ㄨ", u"Τ", u"á", u"■", u"□", u"Φ", u"▪",
            u"Ж", u"②", u"①", u"④", u"③", u"⑥", u"⑤", u"⑧", u"⑦", u"⑩",
            u"⑨", u"ㄉ", u"ㄈ", u"ㄏ", u"λ", u"ㄍ", u"ㄓ", u"ㄒ", u"ㄑ", u"κ",
            u"⑵", u"⑴", u"⑷", u"⑶", u"⑹", u"⑸", u"⑻", u"⑺", u"⑽", u"⑼",
            u"⑿", u"⑾", u"И", u"ο", u"α", u"㏄", u"γ", u"β", u"ε", u"δ",
            u"η", u"ζ", u"Υ", u"ǖ", u"а", u"☆", u"★", u"ｔ", u"ｕ", u"ｖ",
            u"ｗ", u"ｐ", u"ｑ", u"ｒ", u"｜", u"｝", u"～", u"\\", ]
};

sbc = {
        "digit": ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],

        "uppercase": [
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
            'U', 'V', 'W', 'X', 'Y', 'Z'],

        "lowercase": [
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
            'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
            'u', 'v', 'w', 'x', 'y', 'z'],

        "punc": [
            ' ', '!', '"', '#', '$', '%', '&', '\'','(', ')',
            '*', '+', ',', '-', '.', '/', ':', ';', '<', '=',
            '>', '?', '@', '[', '\\',']', '^', '_', '`', '{',
            '|', '}', '~']
};

# --- level 1 ---
CHAR_LETTER =   1
CHAR_DIGIT  =   2
CHAR_PUNC   =   3
CHAR_OTHER  =   -1

# --- level 2 ---
CHAR_LETTER_SBC = 11
CHAR_LETTER_DBC = 12

CHAR_DIGIT_SBC  = 21
CHAR_DIGIT_DBC  = 22

CHAR_PUNC_SBC   = 31
CHAR_PUNC_DBC   = 32

# --- level 3 ---
CHAR_LETTER_SBC_UPPERCASE = 111
CHAR_LETTER_SBC_LOWERCASE = 112
CHAR_LETTER_DBC_UPPERCASE = 121
CHAR_LETTER_DBC_LOWERCASE = 122

CHAR_DIGIT_DBC_CL1 = 221
CHAR_DIGIT_DBC_CL2 = 222
CHAR_DIGIT_DBC_CL3 = 223

CHAR_PUNC_DBC_NORMAL    = 321
CHAR_PUNC_DBC_CHINESE   = 322
CHAR_PUNC_DBC_EXT       = 323

print """#ifndef __LTP_STRUTILS_CHARTYPES_TAB__
#define __LTP_STRUTILS_CHARTYPES_TAB__

#pragma warning(disable: 4309)
"""

def gen(name, prefix, lex):
    print "static const int __chartype_%s_%s_utf8_size__ = %d;" % (
            prefix,
            name.replace("-", "_"),
            len(lex[name]))
    print "static const char* __chartype_%s_%s_utf8_buff__[] = {" % (
            prefix,
            name.replace("-", "_"))
    for i, k in enumerate(lex[name]):
        if k == "\"":
            k = '\\"'
        if k == "\\":
            k = "\\\\"
        print "\"%s\"," % k.encode("utf-8").__repr__()[1:-1],
        if (i+ 1) % 15 == 0:
            print
    print "};"

gen("chinese-punc", "dbc", dbc)
gen("digit", "dbc", dbc)
gen("punc", "dbc", dbc)
gen("uppercase", "dbc", dbc)
gen("punc-ext", "dbc", dbc)
gen("lowercase", "dbc", dbc)
gen("uppercase", "sbc", sbc)
gen("lowercase", "sbc", sbc)
gen("digit", "sbc", sbc)
gen("punc", "sbc", sbc)

print "#endif   // end for __LTP_STRUTILS_CHARTYPES_TAB__"
